package com.carrental.finance.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.carrental.finance.dto.InvoiceDTO;
import com.carrental.finance.entity.Invoice;
import com.carrental.finance.vo.InvoiceVO;

/**
 * 发票服务接口
 */
public interface InvoiceService extends IService<Invoice> {

    /**
     * 创建发票
     *
     * @param invoiceDTO 发票DTO
     * @return 发票ID
     */
    Long createInvoice(InvoiceDTO invoiceDTO);

    /**
     * 根据ID获取发票详情
     *
     * @param id 发票ID
     * @return 发票VO
     */
    InvoiceVO getInvoiceById(Long id);

    /**
     * 根据发票号获取发票详情
     *
     * @param invoiceNo 发票号
     * @return 发票VO
     */
    InvoiceVO getInvoiceByInvoiceNo(String invoiceNo);

    /**
     * 根据订单ID获取发票详情
     *
     * @param orderId 订单ID
     * @return 发票VO
     */
    InvoiceVO getInvoiceByOrderId(Long orderId);

    /**
     * 根据用户ID分页查询发票
     *
     * @param userId 用户ID
     * @param page   分页参数
     * @return 发票VO分页
     */
    Page<InvoiceVO> pageUserInvoices(Long userId, Page<Invoice> page);

    /**
     * 分页查询发票
     *
     * @param page        分页参数
     * @param invoiceNo   发票号
     * @param orderNo     订单号
     * @param userId      用户ID
     * @param invoiceType 发票类型
     * @param status      发票状态
     * @param startTime   开始时间
     * @param endTime     结束时间
     * @return 发票VO分页
     */
    Page<InvoiceVO> pageInvoices(Page<Invoice> page, String invoiceNo, String orderNo, Long userId, Integer invoiceType, Integer status, String startTime, String endTime);

    /**
     * 开具发票
     *
     * @param id 发票ID
     * @return 是否成功
     */
    boolean issueInvoice(Long id);

    /**
     * 作废发票
     *
     * @param id 发票ID
     * @return 是否成功
     */
    boolean invalidateInvoice(Long id);

    /**
     * 更新发票电子URL
     *
     * @param id         发票ID
     * @param invoiceUrl 电子发票URL
     * @return 是否成功
     */
    boolean updateInvoiceUrl(Long id, String invoiceUrl);
} 